<?php
namespace Common;

class Validator
{	
	/**
	 * Filtrerar en sträng efter önskemål
	 * @param $string string (Sträng att filtrera)
	 * @param $mode int (Extern konstant över vad som ska filtreras)
	 * @return string | boolean (Filtrerad textsträng eller false)
	 */
	public static function filterString($string, $mode)
	{
		/**
		 * Modes
		 * 0: Filtera bort HTML
		 * 1: Filtrera bort Javascript
		 */
		switch ($mode)
		{
			// Filtrera enbart bort HTML
			case 0:
				// Om det finns frivilliga parametrar
				if(func_num_args()>2)
				{
					$argList = func_get_args();
					// Börja på index 2 där frivilliga parametrar finns
					for ($i=2; $i<func_num_args(); $i++)
						$string = strip_tags($string, $argList[$i]);
					return $string;
				}
				else
					return strip_tags($string);
				
				break;
			// Filtrera bort JavaScript
			case 1:
				return preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $string);
				break;
			default:
				return false;
				break;
		}
	}
	
	/**
	 * Validerar en e-postadress
	 * @param $email (E-mail string)
	 * @return Boolean
	 */
	public static function validateEmail($email)
	{
		if(filter_var($email, FILTER_VALIDATE_EMAIL))
			return true;
		else
			return false;
	}
	
	/**
	 * Validerar ett nummer
	 * @author Filip Åstrand, fa222cm
	 * @return boolean
	 */
	 public static function validateNumber($number)
	 {
	 	return is_numeric($number);
	 }
	 
	 /**
	  * Validerar ett personnummer i formaten:
	  * ÅÅMMDD-NNNN (11), ÅÅMMDDNNNN (10), ÅÅÅÅMMDD-NNNN (13) och ÅÅÅÅMMDDNNNN (12)
	  * @param $ssn string (Personnummer)
	  * @return $formattedDate string | boolean (Standardformaterat personnummer eller false)
	  */
	public static function validateSSN($ssn)
	{	
		$regEx = '/^(19|20)?[0-9][0-9](0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])-?[0-9]{4}$/';
		
		// Om erhållet datum följer regex
		if(preg_match($regEx, $ssn) > 0)
		{
			$ssnLength = strlen($ssn);
			$today = mktime(0, 0, 0, date("m"), date("d"), date("y"));
			
			switch ($ssnLength)
			{
				// ÅÅMMDDNNNN
				case 10:
					$ssnDate = mktime(0, 0, 0, substr($ssn,2,2), substr($ssn,4,2), substr($ssn,0,2));
					
					// Ogiltigt eller framtida datum
					if($ssnDate == null || $ssnDate>$today)
						return false;
					
					// Formatera enlig standardformat ÅÅMMDD-NNNN
					$formattedDate = substr($ssn,0,6) . "-" . substr($ssn,6,4);
					 
					break;
				// ÅÅMMDD-NNNN
				case 11:
					$ssnDate = mktime(0, 0, 0, substr($ssn,2,2), substr($ssn,4,2), substr($ssn,0,2));
					
					// Ogiltigt eller framtida datum
					if($ssnDate == null || $ssnDate>$today)
						return false;
					
					$formattedDate = $ssn;
					
					break;
				// ÅÅÅÅMMDDNNNN
				case 12:
					$ssnDate = mktime(0, 0, 0, substr($ssn,4,2), substr($ssn,6,2), substr($ssn,0,4));
					
					// Ogiltigt eller framtida datum
					if($ssnDate == null || $ssnDate>$today)
						return false;
					
					// Formatera enlig standardformat ÅÅMMDD-NNNN
					$formattedDate = substr($ssn,2,6) . "-" . substr($ssn,8,4);
					
					break;
				// ÅÅÅÅMMDD-NNNN
				case 13:
					$ssnDate = mktime(0, 0, 0, substr($ssn,4,2), substr($ssn,6,2), substr($ssn,0,4));
					
					// Ogiltigt eller framtida datum
					if($ssnDate == null || $ssnDate>$today)
						return false;
					
					// Formatera enlig standardformat ÅÅMMDD-NNNN
					$formattedDate = substr($ssn,2);
					
					break;
				default:
					return false;
					break;
			}
			
			return Validator::validateLuhn($formattedDate);
		}
		else
			return false;		
	}

	/**
	 * Validerar ett personnummer enligt lhun-logaritmen. 
	 * @param string (personnummer 123456-1234)
	 * @return boolean (true eller false om nummret uppfyller luhn-logaritmen)
	 */
	public static function validateLuhn($lhun){
		
		//Skapar en Array av personnummret	
		$test = array();		
		$test[] = 2*substr($lhun, -11, 1);
		$test[] = 1*substr($lhun, -10, 1);
		$test[] = 2*substr($lhun, -9, 1);
		$test[] = 1*substr($lhun, -8, 1);
		$test[] = 2*substr($lhun, -7, 1);
		$test[] = 1*substr($lhun, -6, 1);
		$test[] = 2*substr($lhun, -4, 1);
		$test[] = 1*substr($lhun, -3, 1);
		$test[] = 2*substr($lhun, -2, 1);
		$test[] = 1*substr($lhun, -1, 1);					

		$sum = 0;
		
		//Loopar igenom och summerar de enskilda talen.
		for ($i = 0; $i<10; $i++)
		{
			$temp = 0;
				
			if($test[$i]>9)
			{
				$temp = substr($test[$i], -2, 1) + substr($test[$i], -1, 1);
				$sum = $temp+$sum;
			}
			else
				$sum = $test[$i]+$sum; 
		}
			
		//Om summan av nummren är delbar med 10 är det ett korrekt personnummer.		
		switch ($sum%10)
		{
			default: 
				return false;
			case 0: 
				return $lhun;
		}
	}
	
	/**
	 * Validerar ett datum i formaten:
	 * ÅÅÅÅ-MM-DD (10), ÅÅ-MM-DD (8), ÅÅMMDD (6)
	 * @param string (datum)
	 * @return string | boolean (Standardformaterat datum eller false)
	 */
	 public static function validateDate($date)
	 {
	 	$regEx = '/^(19|20)?[0-9][0-9](-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])|(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]))$/';
		
		// Om erhållet datum följer regex
		if(preg_match($regEx, $date) > 0)
		{
			$dateLength = strlen($date);
			$today = mktime(0, 0, 0, date("m"), date("d"), date("y"));
			
			switch ($dateLength)
			{
				// ÅÅMMDD
				case 6:
					$givenDate = mktime(0, 0, 0, substr($date,2,2), substr($date,4,2), substr($date,0,2));
					
					// Ogiltigt eller framtida datum
					if($givenDate == null || $givenDate>$today)
						return false;
					
					// Formatera enlig standardformat ÅÅ-MM-DD
					$formattedDate = substr($date,0,2) . "-" . substr($date,3,2) . "-" . substr($date,6,2);

					break;
				// ÅÅ-MM-DD
				case 8:
					$givenDate = mktime(0, 0, 0, substr($date,3,2), substr($date,5,2), substr($date,0,2));
					
					// Ogiltigt eller framtida datum
					if($givenDate == null || $givenDate>$today)
						return false;
					
					// Uppfyller redan standardformat
					$formattedDate = $date;
					
					break;
				// ÅÅÅÅ-MM-DD
				case 10:
					$givenDate = mktime(0, 0, 0, substr($date,5,2), substr($date,8,2), substr($date,0,4));
					
					// Ogiltigt eller framtida datum
					if($givenDate == null || $givenDate>$today)
						return false;
					
					// Formatera enlig standardformat ÅÅ-MM-DD
					$formattedDate = substr($date,2);
					
					break;
				default:
					break;
			}
			
			return $formattedDate;
		}
		else
			return false;
	 }
	 
	 /**
	  * Testar ett lösenord mot säkerhetsregler
	  * @param $password string (lösenordssträng)
	  * @param $minLength int Längden på lösenordet
	  * @return Boolean
	  */
	 public static function validatePassword($password, $minLength)
	 {
	 	if(strlen($password) < $minLength)
			return false;
		else
			return true;
	 }
	 
	 /**
	  * Testar ett användarnamn
	  * @param $userName string
	  * @return Boolean
	  */
	 public static function validateString($str, $length = 1)
	 {
	 	if($str == NULL || $str == "")
			return false;
		
		if(strlen($str)<$length)
			return false;
		
		return true;
	 }
	 
	 /**
	  * Kollar om ett för- eller efternamn är giltigt
	  * @param $string string
	  * @return bool 
	  */
	 public static function validateName($string)
	 {
		if(preg_match("/^[A-ZÅÄÖa-zåäö]+[- ]?[A-ZÅÄÖa-zåäö]+$/", $string) == 1)
			return true;
		else
			return false; 
	 }
	 
	 /**
	  * Kollar om ett användarnamn är giltigt
	  * @param $string string
	  * @return bool 
	  */
	 public static function validateUserName($string)
	 {
		if(preg_match("/^[a-z]+[-]?[a-z]+$/", $string) == 1)
			return true;
		else
			return false; 
	 }
	 
	 /**
	  * Kontrollerar om två strängar överensstämmer
	  * @param $str1 string
	  * @param $str2 string 
	  * @return Boolean
	  */
	 public static function compareStrings($str1, $str2)
	 {
	 	if($str1 != $str2)
			return false;
		else
			return	true;
	 }
}
?>